type BusClass = {
    emit:(name:string) => void
    on:(name:string, callback:Function) => void
}


type ParamsKey = string | number | symbol

// 定义存放回调函数的数据类型 为一个对象，对象的key值为识别事件的标识。对象的值是一个数组，可以存放多个回调函数
type  List = {
    [key:ParamsKey]: Array<Function>
}

class Bus implements BusClass {
    list:List
    constructor() {
        this.list = {}
    }

    // 从list中取出name对应的回调函数并执行,回调函数的入参为args
    emit (name:string, ...args:Array<any>) {
        let fns:Array<Function> = this.list[name]
        fns.forEach(fn => {
            fn.apply(this, args)
        })
    }

    // 将回调函数存放到list中
    on (name:string, callback:Function) {
        let fn:Array<Function> = this.list[name] || []
        fn.push(callback)
        this.list[name] = fn
    }
}

// 返回一个Bus实例，保证全局只有一个该对象
export default new Bus()